// 云对象教程: https://uniapp.dcloud.net.cn/uniCloud/cloud-obj
// jsdoc语法提示教程：https://ask.dcloud.net.cn/docs/#//ask.dcloud.net.cn/article/129
const db = uniCloud.database();
const dbCmd = db.command;
// const uid = "121212"

module.exports = {

	/**
	 * 添加商品到购物车
	 * @param {Object} params - 参数对象
	 * @param {String} params.detailsData.goods_id - 商品ID
	 * @param {Object} params.param - 商品属性参数
	 * @returns {Number} 购物车商品总数
	 */
	async addGoods(params,uid) {
		// 参数验证
		if (!params.detailsData.goods_id) {
			throw new Error('商品ID不能为空');
		}

		if (
			!params.param ||
			!params.param.model ||
			!params.param.specs ||
			!params.param.price ||
			!params.param.serial_number ||
			!params.param.number ||
			!params.param.total_price ||
			!params.param.delivery_date
		) {
			throw new Error('请完善商品参数信息:');
		}

		// 从商品表获取商品信息
		const goodsCollection = db.collection('goods');
		const goodsRes = await goodsCollection.doc(params.detailsData.goods_id).get();

		if (!goodsRes.data || goodsRes.data.length === 0) {
			throw new Error('商品不存在');
		}

		const goodsInfo = goodsRes.data[0];

		// 检查商品是否上架
		if (!goodsInfo.is_shelf) {
			throw new Error('该商品已下架，无法添加到购物车');
		}

		// 准备购物车数据
		const cartData = {
			uid: uid,
			goods_id: params.detailsData.goods_id,
			goods_title: params.detailsData.goods_title,
			goods_image: params.detailsData.goods_image,
			param: {
				model: params.param.model,
				specs: params.param.specs,
				// 从商品规格参数中获取价格，如果没有则使用默认价格
				price: params.param.price || this.getPriceFromSpec(goodsInfo.spec, params.param.model,
					params.param.specs),
				serial_number: params.param.serial_number || this.generateSerialNumber(params.detailsData.goods_id),
				number: params.param.number,
				total_price: (params.param.price || this.getPriceFromSpec(goodsInfo.spec, params.param
					.model, params.param.specs)) * params.param.number,
				delivery_date: params.param.delivery_date || '7天内发货'
			},
			crate_date: new Date()
		};

		// 检查购物车中是否已有相同商品（同一商品、模型、规格）
		const cartCollection = db.collection('cart');
		const queryResult = await cartCollection.where({
			uid: uid,
			goods_id: params.detailsData.goods_id,
			'param.model': params.param.model,
			'param.specs': params.param.specs
		}).get();

		if (queryResult.data && queryResult.data.length > 0) {
			// 已有相同商品，更新数量和总价
			const cartId = queryResult.data[0]._id;
			const currentNumber = queryResult.data[0].param.number;
			const newNumber = currentNumber + params.param.number;

			await cartCollection.doc(cartId).update({
				'param.number': newNumber,
				'param.total_price': cartData.param.price * newNumber
			});
		} else {
			// 没有相同商品，新增记录
			await cartCollection.add(cartData);
		}

		// 增加商品销量统计
		await goodsCollection.doc(params.detailsData.goods_id).update({
			sales: dbCmd.inc(params.param.number)
		});

		// 返回购物车商品总数

		// const cartCollection = db.collection('cart');
		// const db = this.database;
		const result = await db.collection('cart')
			.where({
				uid: uid
			})
			.get();

		// 计算总数
		const totalN = result.data.reduce((total, item) => {
			return total + (item.param?.number || 0);
		}, 0);

		return {
			totalN: totalN
		}
	},

	/**
	 * 从商品规格中提取价格
	 * @param {String} spec - 商品规格字符串
	 * @param {String} model - 选中的模型
	 * @param {String} specs - 选中的规格
	 * @returns {Number} 价格（分）
	 */
	getPriceFromSpec(spec, model, specs) {
		// 实际项目中需要根据实际的规格格式解析
		// 这里只是示例实现
		if (!spec) return 0;

		try {
			// 假设规格是JSON格式字符串
			const specJson = JSON.parse(spec);
			// 根据模型和规格查找价格
			if (specJson[model] && specJson[model][specs]) {
				return specJson[model][specs].price || 0;
			}
		} catch (e) {
			console.error('解析商品规格失败:', e);
		}

		return 0;
	},

	/**
	 * 生成商品编号
	 * @param {String} goodsId - 商品ID
	 * @returns {String} 商品编号
	 */
	generateSerialNumber(goodsId) {
		const date = new Date();
		const timestamp = date.getTime();
		return `SN-${goodsId.substring(0, 8)}-${timestamp}`;
	}
}